home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / CONFIG.PAS < prev    next >
Pascal/Delphi Source File  |  1996-04-28  |  33KB  |  1,145 lines

  1. UNIT Config;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Config of anything except mail options        Last changed: 28.04.96  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-96 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32;
  16.  
  17. PROCEDURE SaveConfiguration;
  18. PROCEDURE DisplayKeys(EditKeys: Boolean);
  19. PROCEDURE IncModemType(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  20. PROCEDURE IncNodelist(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  21. PROCEDURE IncBBSType(VAR Value; ID:WORD; Factor:Integer; VAR s:STRING);
  22. PROCEDURE IncTaskType(VAR Value; ID:WORD; Factor:Integer; VAR s:STRING);
  23. PROCEDURE IncReqOnUs(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  24. PROCEDURE Configuration(Forced: Boolean; VAR Key: LongInt);
  25.  
  26. IMPLEMENTATION
  27.  
  28. USES Dos, OpCrt, OpEntry, OpDate, OpString, OpPick, OpWindow, OpCmd, OpFrame,
  29.      OpSelect, OpKey, OpRoot,
  30.      MailCfg, Globals, OproUtil, Util, StrUtil, Input, KeyBoard, Display,
  31.      Resource, NetFile, RBrowser, PoPTypes, TextEdit, Newimp, NewExp, LogFile;
  32.  
  33. TYPE
  34.   PColorSelector = ^TColorSelector;
  35.   TColorSelector = OBJECT(PickList)
  36.     Names : StringArrayPtr;
  37.  
  38.     CONSTRUCTOR Init(ANames: StringArrayPtr);
  39.     PROCEDURE ItemString(Item: Word; Mode: PkMode; Var IType: PkItemType; var IString: string); Virtual;
  40.   END;
  41.  
  42.   CONSTRUCTOR TColorSelector.Init(ANames: StringArrayPtr);
  43.   BEGIN
  44.     Names:=ANames;
  45.     IF NOT INHERITED InitAbstract(20, 6, 60, 18, Cfg.Color[3],
  46.                                   DefWindowOptions OR wBordered,
  47.                                   40, Names^.NumStrings, PickVertical, SingleChoice) THEN
  48.       Fail;
  49.     IF Cfg.Screen.ExplodingWin THEN EnableExplosions(10);
  50.     wFrame.AddHeader(' Select color scheme ', heTC);
  51.     AddMoreHeader(' More   ', HeBR, #24, #25, '', 7, 8, 0);
  52.     SetSearchMode(PickStringSearch);
  53.     SetPadSize(1, 1);
  54.   END;
  55.  
  56.   PROCEDURE TColorSelector.ItemString(Item: Word; Mode: PkMode; Var IType: PkItemType; Var IString: String);
  57.   BEGIN
  58.     Istring:=Trim(Copy(Names^.GetString(Item), 1, 40));
  59.   END;
  60.  
  61.  
  62.   PROCEDURE ReadNames(VAR Names: StringArrayPtr; CONST APath: PathStr);
  63.   VAR
  64.     ColorScheme : TColorScheme;
  65.     f           : TNetFile;
  66.     Sr          : SearchRec;
  67.   BEGIN
  68.     New(Names, Init(100, 2100));
  69.     IF Names<>NIL THEN
  70.     BEGIN
  71.       FindFirst(AddBackSlash(APath)+'*.CLR', AnyFile, Sr);
  72.       WHILE DOSError=0 DO
  73.       BEGIN
  74.         IF Sr.Size=SizeOf(TColorScheme) THEN
  75.         BEGIN
  76.           f.Open(AddBackSlash(APath)+Sr.Name, SizeOf(ColorScheme), False);
  77.           f.GetRec(ColorScheme, 0, NoKeep, Wait);
  78.           f.Close;
  79.           Names^.AddString(Pad(ColorScheme.Desc, 40)+Sr.Name);
  80.         END;
  81.         IF Sr.Size=SizeOf(ColorSet)*4 THEN { Old version without desc.}
  82.         BEGIN
  83.           Names^.AddString(Pad(Sr.Name, 40)+Sr.Name);
  84.         END;
  85.         FindNext(Sr);
  86.       END;
  87.       FindClose(Sr);
  88.     END ELSE
  89.       AddLog('!', 'Not enough memory to read color schemes');
  90.   END;
  91.  
  92.  
  93.   PROCEDURE DoESR(VAR ESR: TPoPEntryScreen; VAR Win: WindowPtr);
  94.   BEGIN
  95.     Esr.SetPostEditProc(ConfigPostEdit);
  96.     Esr.Process;
  97.     Esr.Done;
  98.     KillWindow(Win);
  99.   END;
  100.  
  101.   PROCEDURE DisplayKeys(EditKeys: Boolean);
  102.   VAR
  103.     Win : WindowPtr;
  104.   BEGIN
  105.     GetESRAndWin(ESRFuncKeys,2,ESR,Win);
  106.     ESR.SetPostEditProc(ConfigPostEdit);
  107.     ESR.Draw;
  108.     IF EditKeys THEN
  109.     BEGIN
  110.       Esr.Process;
  111.     END ELSE
  112.     BEGIN
  113.       WaitForAction(3000);
  114.     END;
  115.     Esr.Done;
  116.     KillWindow(Win);
  117.   END;
  118.  
  119.   PROCEDURE SaveConfiguration;
  120.   VAR
  121.     f : FILE OF TConfig;
  122.   BEGIN
  123.     Assign(f, StartPath+PoPCfgFileName);
  124.     Rewrite(f);
  125.     Write(f,cfg);
  126.     Close(f);
  127.   END;
  128.  
  129.   PROCEDURE LoadConfiguration;
  130.   VAR
  131.     f : FILE OF TConfig;
  132.   BEGIN
  133.     Assign(f, StartPath+PoPCfgFileName); FileMode:=ShareRead+ShareDenyW;
  134.     Reset(f);
  135.     Read(f,cfg);
  136.     IF IOResult<>0 THEN ;
  137.     Close(f);
  138.     CheckSnow:=Cfg.Screen.ChkSnow;
  139.   END;
  140.  
  141. {--- EventEdit: Start -------------------------------------------------------}
  142.  
  143.   PROCEDURE EventPostEdit(Esr: EntryScreenPtr); far;
  144.   BEGIN
  145.     IF (ESR^.CurrentFieldModified) THEN Save:=True;
  146.   END;
  147.  
  148.   FUNCTION _GetEventStr(VAR Buffer; VAR f: TNetFile): String; far;
  149.   CONST
  150.     YN : ARRAY[False..True] OF S3 = ('No ','Yes');
  151.   VAR
  152.     s   : STRING;
  153.     x,y : Byte;
  154.   BEGIN
  155.     WITH TEvent(Buffer) DO
  156.     BEGIN
  157.       s:=LongintForm('###',f.FilePos)+' '+YN[(Active AND $80)=$80]+' '+LongintForm('###',TaskNumber)+' '+
  158.          TimeToTimeString('hh:mm',Start)+' '+
  159.          LongIntForm('###',InitExit)+' '+LongIntForm('###',MailExit)+' '+
  160.          LongIntForm('###',PollExit)+' '+LongIntForm('###',FilesExit)+' ';
  161.       y:=1;
  162.       FOR x:=0 TO 6 DO
  163.       BEGIN
  164.         IF active AND y=y THEN s:=s+DayString[DayType(x+1-(Byte(x=6)*7))][1] ELSE s:=s+' ';
  165.         y:=y SHL 1;
  166.       END;
  167.       s:=s+' '+CPad(Description,20);
  168.     END;
  169.     _GetEventStr:=s;
  170.   END;
  171.  
  172.   FUNCTION EventFlagNames(typ: LongInt): STRING;
  173.   VAR
  174.     s:STRING;
  175.   BEGIN
  176.     IF typ AND  etForced<>0 THEN   s:='Forced ' ELSE s:='';
  177.     IF typ AND  etRequests<>0 THEN s:=s+'Req ';
  178.     IF typ AND  etUsers<>0 THEN    s:=s+'User ' ELSE s:=s+'Mail ';
  179.     IF typ AND  etReceive<>0 THEN  s:=s+'Recv ';
  180.     IF typ AND  etCrash<>0 THEN    s:=s+'CM ';
  181.     IF typ AND  etNoSend<>0 THEN   s:=s+'No-Send ';
  182.     IF typ AND  etDynamic<>0 THEN  s:=s+'Dynamic ';
  183.     IF typ AND  etClrOut<>0 THEN   s:=s+'Clr.Out ';
  184.     IF typ AND  etNoAnswer<>0 THEN s:=s+'No-Answer ';
  185.     IF typ AND  etOnceOnly<>0 THEN s:=s+'Once-Only ';
  186.     IF typ AND  etPoPList<>0 THEN  s:=s+'PoPList ';
  187.     IF typ AND  etTossMail<>0 THEN s:=s+'Toss ';
  188.     IF typ AND  etScanMail<>0 THEN s:=s+'Scan ';
  189.     IF typ AND  etPackMail<>0 THEN s:=s+'Pack ';
  190.     IF typ AND  etNoFiles<>0 THEN  s:=s+'No-Files ';
  191.     EventFlagNames:=s;
  192.   END;
  193.  
  194.   FUNCTION flagon(mask : Word) : S5;
  195.   BEGIN
  196.     IF mask=4 THEN
  197.     BEGIN
  198.       IF CurrentEvent.typ AND mask<>0 THEN flagon:='Users' ELSE flagon:='Mail ';
  199.     END ELSE
  200.       IF CurrentEvent.typ AND mask<>0 THEN flagon:='On ' ELSE flagon:='Off';
  201.   END;
  202.  
  203.   procedure EventCustomStringProc(var Name : String; Key : LongInt;
  204.                                   Selected, Highlighted : Boolean;
  205.                                   WPtr : RawWindowPtr); far;
  206.   var
  207.     s : S5;
  208.   begin
  209.     s:=FlagOn(1 SHL (Key-1));
  210.     Move(s[1], Name[Length(Name)-4], Length(s));
  211.   end;
  212.  
  213.  
  214.   PROCEDURE Edit_Flags;      { EDIT user Flags }
  215.   VAR
  216.     m     : TPoPMenu;
  217.     key   : WORD;
  218.   BEGIN
  219.     Topic:=199;
  220.     GetMenu(MNUEventFlags,3,m);
  221.     M.SetCustomStringProc(EventCustomStringProc);
  222.     REPEAT
  223.       M.Process;
  224.       Key:=M.MenuChoice;
  225.       CASE Key OF
  226.         1..15 : BEGIN
  227.                   IF m.GetLastCommand<>ccQuit THEN
  228.                   BEGIN
  229.                     CurrentEvent.typ:=CurrentEvent.typ XOR (1 SHL (Key-1));
  230.                     Save:=True;
  231.                   END;
  232.                 END;
  233.       END;
  234.     UNTIL m.GetLastCommand=ccQuit;
  235.     m.Done;
  236.     Topic:=0;
  237.   END;
  238.  
  239.   PROCEDURE _EditEvent(VAR Buffer; VAR Changed: Boolean; RecNum, MaxRec: LongInt); far;
  240.   VAR
  241.     ExitCode:WORD;
  242.   BEGIN
  243.     Esr.Select;
  244.     Esr.SetNextField(0);
  245.     Esr.Draw;
  246.     Save:=False;
  247.     REPEAT
  248.       Esr.Process;
  249.       ExitCode:=ESR.GetLastCommand;
  250.       CASE ExitCode OF
  251.         ccUser7 : BEGIN
  252.                     Edit_Flags;
  253.                     ExitCode:=ccNone;
  254.                   END;
  255.       END;
  256.     UNTIL (ExitCode=ccDone) OR (ExitCode=ccQuit);
  257.     Changed:=Save;
  258.   END;
  259.  
  260.   PROCEDURE _InitEvent(VAR Buffer); far;
  261.   BEGIN
  262.     FillChar(Buffer,SizeOf(TEvent),0);
  263.     TEvent(Buffer).TaskNumber:=Cfg.TaskNumber;
  264.     TEvent(Buffer).Tries.Bad:=5;
  265.     TEvent(Buffer).Tries.Busy:=10;
  266.     TEvent(Buffer).Active:=255;
  267.   END;
  268.  
  269.   FUNCTION _IsGreaterEvent(VAR B1,B2): Boolean; far;
  270.   BEGIN
  271.     _IsGreaterEvent:=TEvent(B1).Start>TEvent(B2).Start;
  272.   END;
  273.  
  274.   PROCEDURE _EventUpd(ASP: AbstractSelectorPtr); far;
  275.   BEGIN
  276.     FastWrite(CPad(EventFlagNames(CurrentEvent.Typ),42),19,21,Cfg.Color[2].FieldColor);
  277.   END;
  278.  
  279.   PROCEDURE EventEdit;
  280.   VAR
  281.     ExitCode : Word;
  282.     f        : TNetFile;
  283.  
  284.     PROCEDURE MakeEventScreen;
  285.     BEGIN
  286.       GetEsr(EsrEventSetup,2,Esr);
  287.       ESR.SetPostEditProc(EventPostEdit);
  288.       ESR.SetScreenUpdateProc(_EventUpd);
  289.       EntryCommands.addcommand(ccUser7,1,WORD(256*65),0);
  290.     END;
  291.  
  292.   BEGIN
  293.     f.Open(StartPath+PoPEventFileName,SizeOf(TEvent),True);
  294.     MakeEventScreen;
  295.     BrowseRecords(f,CurrentEvent,ExitCode,'EVENT FILE',
  296.                   'Ev# Ena Tsk Start Ini Mai Pol Fil Ev.Days Description',
  297.                   _GetEventStr,_EditEvent,_InitEvent,_IsGreaterEvent);
  298.     Esr.Done;
  299.     f.GetRec(CurrentEvent,Data.Event-1,NoKeep,Wait);
  300.     f.Close;
  301.   END;
  302.  
  303.  
  304. {=== EditEvent: End ======================================================== }
  305.  
  306.   PROCEDURE function_key_options;
  307.   BEGIN
  308.     DisplayKeys(True);
  309.   END;
  310.  
  311.   PROCEDURE LoadColorScheme(CONST APath: PathStr);
  312.   VAR
  313.     f           : TNetFile;
  314.     ColorScheme : TColorScheme;
  315.     ColSel      : PColorSelector;
  316.     Names       : StringArrayPtr;
  317.     s           : STRING;
  318.     i           : Byte;
  319.   BEGIN
  320.     ReadNames(Names, APath);
  321.     IF Names^.NumStrings>0 THEN
  322.     BEGIN
  323.       New(ColSel, Init(Names));
  324.       IF (ColSel<>NIL) THEN
  325.       BEGIN
  326.         ColSel^.Process;
  327.         IF ColSel^.GetLastCommand<>ccquit THEN
  328.         BEGIN
  329.           s:=Names^.GetString(ColSel^.GetLastChoice);
  330.           s:=Copy(s, 41, 12);
  331.           f.Open(AddBackSlash(APath)+s, SizeOf(ColorScheme), False);
  332.           f.GetRec(ColorScheme, 0, NoKeep, Wait);
  333.           f.Close;
  334.           FOR i:=1 TO 4 DO
  335.             Cfg.Color[i]:=ColorScheme.Color[i];
  336.           ConfigChanged:=True;
  337.         END;
  338.         Dispose(ColSel, Done);
  339.       END;
  340.     END;
  341.     Dispose(Names, Done);
  342.   END;
  343.  
  344.   PROCEDURE SaveColorScheme;
  345.   VAR
  346.     s : PathStr;
  347.     f : TNetFile;
  348.     i : Byte;
  349.     ColorScheme : TColorScheme;
  350.   BEGIN
  351.     IF Cfg.TaskNumber=0 THEN s:='PORTAL.CLR' ELSE s:='PORTAL'+HexB(Cfg.TaskNumber)+'.CLR';
  352.     s:=StartPath+s;
  353.     IF InputString(5,10,70,50,3,'Save color scheme','Filename : ',s) THEN
  354.     BEGIN
  355.       IF f.Open(s, SizeOf(TColorScheme), True) THEN
  356.       BEGIN
  357.         FillChar(ColorScheme, SizeOf(ColorScheme), 0);
  358.         FOR i:=1 TO 4 DO
  359.           ColorScheme.Color[i]:=Cfg.Color[i];
  360.         ColorScheme.Address:=Cfg.Addresses[Cfg.MainAdrNum];
  361.         ColorScheme.MadeBy:=Cfg.Sysop;
  362.         InputString(15,12,40,40,3,'Save color scheme','Desc : ', ColorScheme.Desc);
  363.         f.Write(ColorScheme);
  364.         f.Close;
  365.       END;
  366.     END;
  367.   END;
  368.  
  369.   PROCEDURE ColorConfiguration;
  370.   VAR
  371.     farve    : ARRAY[1..4,1..31,1..2] OF BYTE;
  372.     Temp     : WindowPtr;
  373.     attr,
  374.     level,
  375.     farvenum : BYTE;
  376.     InKey    : Word;
  377.     s        : S10;
  378.     Txt      : STRING;
  379.  
  380.     FUNCTION Name(Num:BYTE):S21;
  381.     BEGIN
  382.       CASE Num OF
  383.         01 : Name:='Text';
  384.         02 : Name:='Ctrl char';
  385.         03 : Name:='Frame';
  386.         04 : Name:='Header';
  387.         05 : Name:='Shadow';
  388.         06 : Name:='HighLight';
  389.         07 : Name:='Prompt';
  390.         08 : Name:='Selected prompt';
  391.         09 : Name:='Protected prompt';
  392.         10 : Name:='Field';
  393.         11 : Name:='Selected field';
  394.         12 : Name:='Protected field';
  395.         13 : Name:='Scroll bar';
  396.         14 : Name:='Slider';
  397.         15 : Name:='Hot spot';
  398.         16 : Name:='Block';
  399.         17 : Name:='Marker';
  400.         18 : Name:='Delimiter';
  401.         19 : Name:='Selected delimiter';
  402.         20 : Name:='Protected delimiter';
  403.         21 : Name:='Selected item';
  404.         22 : Name:='Protected item';
  405.         23 : Name:='HighLight item';
  406.         24 : Name:='Alternate select item';
  407.         25 : Name:='Alt. selected item';
  408.         26 : Name:='Flex A item';
  409.         27 : Name:='Flex B item';
  410.         28 : Name:='Flex C item';
  411.         29 : Name:='UnSelected Xref item';
  412.         30 : Name:='Selected Xref item';
  413.         ELSE Name:='';
  414.       END;
  415.     END;
  416.  
  417.     PROCEDURE DisplaySample(i,colorno:BYTE);
  418.     BEGIN
  419.       IF i<16 THEN
  420.         Temp^.wFastWrite(CPad(Name(i),24),i+1,2,colorno)
  421.       ELSE
  422.         Temp^.wFastWrite(CPad(Name(i),24),i-14,28,colorno);
  423.     END;
  424.  
  425.     PROCEDURE DisplayLevel;
  426.     VAR
  427.       i:BYTE;
  428.     BEGIN
  429.       FOR i:=1 TO 30 DO
  430.         DisplaySample(i,farve[level,i,1]);
  431.       Temp^.wFastText('Current level: '+Long2Str(level),18,2);
  432.     END;
  433.  
  434.     FUNCTION SelectAttribute(Cur:BYTE):BYTE;
  435.     VAR
  436.       w:WindowPtr;
  437.       Inkey:WORD;
  438.       x,y:BYTE;
  439.     BEGIN
  440.       mywin(w,44,9,79,18,0,'Select color',False);
  441.       FOR y:=0 TO 7 DO
  442.         FOR x:=0 TO 15 DO
  443.           w^.wFastWrite('<>',y+1,(x*2)+2,x+(y*16));
  444.       x:=Cur MOD 16;
  445.       y:=Cur DIV 16;
  446.       REPEAT
  447.         w^.wFastText(#17#16,y+1,(x*2)+2);
  448.         InKey:=PoPReadKeyWord;
  449.         w^.wFastText('<>',y+1,(x*2)+2);
  450.         CASE InKey OF
  451.           Up    : BEGIN
  452.                     REPEAT
  453.                       IF y>0  THEN DEC(y) ELSE y:=7;
  454.                     UNTIL y<>x;
  455.                   END;
  456.           Down  : BEGIN
  457.                     REPEAT
  458.                       IF y<7  THEN INC(y) ELSE y:=0;
  459.                     UNTIL y<>x;
  460.                   END;
  461.           Left  : BEGIN
  462.                     REPEAT
  463.                       IF x>0  THEN DEC(x) ELSE x:=15;
  464.                     UNTIL y<>x;
  465.                   END;
  466.           Right : BEGIN
  467.                     REPEAT
  468.                       IF x<15 THEN INC(x) ELSE x:=0;
  469.                     UNTIL y<>x;
  470.                   END;
  471.         END;
  472.         DisplaySample(farvenum,x+(16*y));
  473.       UNTIL (InKey=ESC) OR (InKey=Enter);
  474.       KillWindow(w);
  475.       IF InKey=Enter THEN Cur:=x+(16*y);
  476.       SelectAttribute:=Cur;
  477.     END;
  478.  
  479.     PROCEDURE PlaceMarker(on:BOOLEAN);
  480.     VAR
  481.       ch1,ch2:CHAR;
  482.     BEGIN
  483.       IF on THEN
  484.       BEGIN
  485.         ch1:='>';
  486.         ch2:='<';
  487.       END ELSE
  488.       BEGIN
  489.         ch1:=' ';
  490.         ch2:=' ';
  491.       END;
  492.       IF farvenum<16 THEN
  493.       BEGIN
  494.         Temp^.wFastWrite(ch1,FarveNum+1,1,7);
  495.         Temp^.wFastWrite(ch2,FarveNum+1,26,7);
  496.       END ELSE
  497.       BEGIN
  498.         Temp^.wFastWrite(ch1,FarveNum-14,27,7);
  499.         Temp^.wFastWrite(ch2,FarveNum-14,52,7);
  500.       END;
  501.     END;
  502.  
  503.   BEGIN
  504. {   hiddencursor;}
  505.     mywin(Temp,1,2,80,ScreenHeight,0,'Color Configuration',False);
  506.     MOVE(Cfg.Color[1].TextColor,Farve,31*4*2);
  507.     level:=1;
  508.     DisplayLevel;
  509.     farvenum:=1;
  510.     WITH Temp^ DO
  511.     BEGIN
  512.       wFastText('Left/Right/Up/Down selects another color, PgUp/PgDn selects screen level.',21, 2);
  513.       wFastText('Return change color. Press F1 for more help on what the colors are used for',22, 2);
  514.     END;
  515.     REPEAT
  516.       attr:=farve[level,farvenum,1];
  517.       placemarker(True);
  518.       Topic:=699+farvenum;
  519.       InKey:=PopReadKeyWord;
  520.       placemarker(False);
  521.       CASE InKey OF
  522.         Enter: BEGIN
  523.                  attr:=SelectAttribute(attr);
  524.                  farve[level,farvenum,1]:=attr;
  525.                  farve[level,farvenum,2]:=attr;
  526.                  MOVE(Farve,Cfg.Color,31*4*2);
  527.                  ConfigChanged:=True;
  528.                  DisplayLevel;
  529.                END;
  530.         Right,
  531.         Left : IF farvenum>15 THEN DEC(farvenum,15) ELSE INC(farvenum,15);
  532.         Up   : IF FarveNum>1 THEN DEC(farvenum) ELSE farvenum:=30;
  533.         Down : IF FarveNum<30 THEN INC(farvenum) ELSE farvenum:=1;
  534.         PgUp : BEGIN
  535.                  DEC(level);
  536.                  IF level<1 THEN level:=4;
  537.                  DisplayLevel;
  538.                END;
  539.         PgDn : BEGIN
  540.                  INC(level);
  541.                  IF Level>4 THEN Level:=1;
  542.                  DisplayLevel;
  543.                END;
  544.       END;
  545.     UNTIL InKey=Esc;
  546.     KillWindow(Temp);
  547.   END;
  548.  
  549.   PROCEDURE MiscScreen;
  550.   VAR
  551.     Win : WindowPtr;
  552.   BEGIN
  553.     GetEsrAndWin(EsrMiscScreen,2,Esr,Win) ;
  554.     DoEsr(Esr, Win);
  555.     CheckSnow:=Cfg.Screen.ChkSnow;
  556.   END;
  557.  
  558.   PROCEDURE IncModemType(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  559.   BEGIN
  560.     CASE Factor OF
  561.       +1: IF Byte(Value)<7 THEN Inc(Byte(Value)) ELSE Byte(Value):=0;
  562.       -1: IF Byte(Value)>0 THEN Dec(Byte(Value)) ELSE Byte(Value):=7;
  563.     END;
  564.     S:=Cfg.NLCompiler.MTypeStr[Byte(Value)];
  565.   END;
  566.  
  567.   PROCEDURE ConnectStatistics;
  568.   VAR
  569.     Win : WindowPtr;
  570.   BEGIN
  571.     GetEsrAndWin(EsrMdmConnStat,2,Esr,Win);
  572.     DoEsr(ESR,Win);
  573.   END;
  574.  
  575.   PROCEDURE AdvModemOptions;
  576.   VAR
  577.     Win : WindowPtr;
  578.   BEGIN
  579.     GetEsrAndWin(EsrAdvMdmOptions,2,Esr,Win);
  580.     DoEsr(ESR,Win);
  581.   END;
  582.  
  583.   PROCEDURE ModemOptions;
  584.   VAR
  585.     Win : WindowPtr;
  586.   BEGIN
  587.     GetEsrAndWin(EsrMdmOptions,2,Esr,Win);
  588.     DoEsr(ESR,Win);
  589.   END;
  590.  
  591.   PROCEDURE IncNodelist(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  592.   BEGIN
  593.     CASE Factor OF
  594.       +1: IF Byte(Value)<4 THEN Inc(Byte(Value)) ELSE Byte(Value):=0;
  595.       -1: IF Byte(Value)>0 THEN Dec(Byte(Value)) ELSE Byte(Value):=4;
  596.     END;
  597.     CASE Byte(Value) OF
  598.       0 : s:='Version 6';
  599.       1 : s:='QuickBBS';
  600.       2 : s:='R.Access';
  601.       3 : s:='Version 7';
  602.       4 : s:='SuperBBS';
  603.     END;
  604.   END;
  605.  
  606.   PROCEDURE IncBBSType(VAR Value; ID: Word; Factor: Integer; VAR s: STRING);
  607.   CONST
  608.     MaxType = 7;
  609.   BEGIN
  610.     CASE Factor OF
  611.       +1 : BEGIN
  612.              INC(ShortInt(Value));
  613.              IF ShortInt(Value)>MaxType THEN ShortInt(Value):=0;
  614.            END;
  615.       -1 : BEGIN
  616.              DEC(ShortInt(Value));
  617.              IF ShortInt(Value)<0 THEN ShortInt(Value):=MaxType;
  618.            END;
  619.     END;
  620.     CASE Byte(Value) OF
  621.       0 : s:='None';
  622.       1 : s:='QuickBBS';
  623.       2 : s:='ProBoard';
  624.       3 : s:='Opus 1.10';
  625.       4 : s:='R.Access';
  626.       5 : s:='Opus 1.73+';
  627.       6 : s:='SuperBBS';
  628.       7 : s:='Maximus 2.0';
  629.     END;
  630.   END;
  631.  
  632.   PROCEDURE IncTaskType(VAR Value; ID: Word; Factor: Integer; VAR s: STRING);
  633.   BEGIN
  634.     CASE Factor OF
  635.       +1 : BEGIN
  636.              INC(ShortInt(Value));
  637.              IF ShortInt(Value)>2 THEN ShortInt(Value):=0;
  638.            END;
  639.       -1 : BEGIN
  640.              DEC(ShortInt(Value));
  641.              IF ShortInt(Value)<0 THEN ShortInt(Value):=2;
  642.            END;
  643.     END;
  644.     CASE Byte(Value) OF
  645.       0 : s:='Normal';
  646.       1 : s:='Function server';
  647.       2 : s:='Function user';
  648.     END;
  649.   END;
  650.  
  651.   PROCEDURE DirectoryPostEdit(Esr: EntryScreenPtr); far;
  652.   BEGIN
  653.     WITH Esr^ DO
  654.     BEGIN
  655.       IF CurrentFieldModified THEN ConfigChanged:=True;
  656.       CASE GetCurrentID OF
  657.          0 : IF TestDirectoryPath(Esr^,Cfg.Inbound[nsUnKnown],True) THEN ConfigChanged:=True;
  658.          1 : IF TestDirectoryPath(Esr^,Cfg.Inbound[nsKnown],True) THEN ConfigChanged:=True;
  659.          2 : IF TestDirectoryPath(Esr^,Cfg.Inbound[nsPassword],True) THEN ConfigChanged:=True;
  660.          3 : IF TestDirectoryPath(Esr^,Cfg.Outbound,False) THEN ConfigChanged:=True;
  661.          4 : IF TestDirectoryPath(Esr^,Cfg.NodeList,True) THEN ConfigChanged:=True;
  662.         11 : IF TestDirectoryPath(Esr^,Cfg.BBS.Path,True) THEN ConfigChanged:=True;
  663.         12 : IF TestDirectoryPath(Esr^,Cfg.SwapDir,True) THEN ConfigChanged:=True;
  664.       END;
  665.     END;
  666.   END;
  667.  
  668.   PROCEDURE directories;
  669.   VAR
  670.     FuncKeyWin : windowptr;
  671.   BEGIN
  672.     MyWin(FuncKeyWin, 1,ScreenHeight-1,80,ScreenHeight,2,'',False);
  673.     WITH FuncKeyWin^, cfg.color[2] DO
  674.     BEGIN
  675.       wFastText('F1=Help        F2=Select      F3=Edit (banner)',1,2);
  676.     END;
  677.     GetEsr(EsrDirAndFiles,2,Esr);
  678.     WITH Esr DO
  679.     BEGIN
  680.       SetPostEditProc(DirectoryPostEdit);
  681.       EntryCommands.AddCommand(ccUser2, 1, F2, 0);
  682.       EntryCommands.AddCommand(ccUser3, 1, F3, 0);
  683.     END;
  684.     REPEAT
  685.       Esr.Process;
  686.       CASE Esr.GetLastCommand OF
  687.         ccUser2 : CASE Esr.GetCurrentId OF
  688.                     5 : IF SelectFile(Cfg.BBS.UserFile) THEN ConfigChanged:=True;
  689.                     6 : IF SelectFile(Cfg.LogFileName) THEN ConfigChanged:=True;
  690.                     9 : IF SelectFile(Cfg.DefaultMacro) THEN ConfigChanged:=True;
  691.                     10: IF SelectFile(Cfg.Editor) THEN ConfigChanged:=True;
  692.                     14: IF SelectFile(Cfg.Banner) THEN ConfigChanged:=True;
  693.                   END;
  694.         ccUser3 : If (Esr.GetCurrentID = 14) and (Cfg.Banner<>'') Then RunTextEditor(Cfg.Banner);
  695.       END;
  696.     UNTIL (esr.getlastcommand=ccquit) OR (esr.getlastcommand=ccDone);
  697.     Esr.Done;
  698.     KillWindow(FuncKeyWin);
  699.   END;
  700.  
  701.   PROCEDURE matrix_info;
  702.   VAR
  703.     Win : WindowPtr;
  704.   BEGIN
  705.     GetEsrAndWin(EsrMatrixInfo,2,esr,Win);
  706.     DoEsr(Esr,Win);
  707.   END;
  708.  
  709.   PROCEDURE InboundControl;
  710.   VAR
  711.     Win : WindowPtr;
  712.   BEGIN
  713.     GetEsrAndWin(EsrInboundToDoSetup, 2, Esr, Win);
  714.     DoEsr(Esr, Win);
  715.   END;
  716.  
  717.   PROCEDURE GlobalValues;
  718.   VAR
  719.     Win : WindowPtr;
  720.   BEGIN
  721.     GetEsrAndWin(EsrGlobalVal,2,Esr,Win);
  722.     DoEsr(Esr,Win);
  723.   END;
  724.  
  725.   PROCEDURE DumbTerminalSetup;
  726.   VAR
  727.     Win : WindowPtr;
  728.   BEGIN
  729.     GetEsrAndWin(EsrDumbTermSetup,2,Esr,Win);
  730.     DoEsr(Esr,Win);
  731.   END;
  732.  
  733.   PROCEDURE DumbTerminalExternalProtocols;
  734.   VAR
  735.     Win : WindowPtr;
  736.   BEGIN
  737.     GetEsrAndWin(EsrDumbTermExt,2,Esr,Win);
  738.     DoEsr(Esr,Win);
  739.   END;
  740.  
  741.   PROCEDURE NlCompPostEdit(Esr: EntryScreenPtr); far;
  742.   BEGIN
  743.     IF ESR^.GetLastCommand=ccUser2 THEN
  744.     BEGIN
  745.       CASE ESR^.GetCurrentID OF
  746.         0 : SelectFile(Cfg.NLCompiler.CostFileName);
  747.       END;
  748.     END;
  749.     IF ESR^.CurrentFieldModified THEN ConfigChanged:=True;
  750.   END;
  751.  
  752.   PROCEDURE NodelistCompilerSetup;
  753.   VAR
  754.     Win : WindowPtr;
  755.   BEGIN
  756.     GetEsrAndWin(EsrNLCompSetup,2,Esr,Win);
  757.     WITH Esr DO
  758.     BEGIN
  759.       SetPostEditProc(NlCompPostEdit);
  760.       REPEAT
  761.         process;
  762.       UNTIL GetLastCommand IN [ccDone,ccQuit];
  763.     END;
  764.     Esr.Done;
  765.     KillWindow(Win);
  766.   END;
  767.  
  768. FUNCTION _GetNLTStr(VAR Buffer; VAR f: TNetFile): String; far;
  769. VAR
  770.   s   : STRING;
  771. BEGIN
  772.   WITH TNLTranslat(Buffer) DO
  773.   BEGIN
  774.     s:=Pad(NumFrom,35)+NumTo;
  775.   END;
  776.   _GetNLTStr:=s;
  777. END;
  778.  
  779. PROCEDURE _EditNLT(VAR Buffer; VAR Changed: Boolean; RecNum, MaxRec: LongInt); far;
  780. VAR
  781.   ExitCode:WORD;
  782. BEGIN
  783.   Esr.Select;
  784.   Esr.SetNextField(0);
  785.   Esr.Draw;
  786.   Save:=False;
  787.   Esr.Process;
  788.   Changed:=Save;
  789. END;
  790.  
  791. PROCEDURE _InitNLT(VAR Buffer); far;
  792. BEGIN
  793.   FillChar(Buffer,SizeOf(TNLTranslat),0);
  794. END;
  795.  
  796. FUNCTION _IsGreaterNLT(VAR B1,B2): Boolean; far;
  797. BEGIN
  798.   _IsGreaterNLT:=TNLTranslat(B1).NumFrom>TNLTranslat(B2).NumFrom;
  799. END;
  800.  
  801. PROCEDURE NLTPostEdit(Esr: EntryScreenPtr); far;
  802. BEGIN
  803.   IF (ESR^.CurrentFieldModified) THEN Save:=True;
  804. END;
  805.  
  806. PROCEDURE NodeListCompilerTranslationTable;
  807. VAR
  808.   ExitCode:WORD;
  809.   NLT:TNLTranslat;
  810.   p:POINTER;
  811.   f : TNetFile;
  812.  
  813.   PROCEDURE MakeNLTScreen;
  814.   BEGIN
  815.     GetEsr(EsrNLTranslatSetup,2,Esr);
  816.     Esr.SetPostEditProc(NLTPostEdit);
  817.     p:=Esr.GetUserRecord;
  818.   END;
  819.  
  820. BEGIN
  821.   f.Open(StartPath+PoPNLTranslateFileName,SizeOf(TNLTranslat),True);
  822.   MakeNLTScreen;
  823.   BrowseRecords(f,p^,ExitCode,'Nodelist compiler: Translation table entries',
  824.                 Pad('Original',35)+'New',_GetNLTStr,_EditNLT,_InitNLT,_IsGreaterNLT);
  825.   Esr.Done;
  826.   f.Close;
  827. END;
  828.  
  829.   PROCEDURE ConnectionPostEdit(Esr: EntryScreenPtr); far;
  830.   BEGIN
  831.     IF (ESR^.GetCurrentID=0) AND (ESR^.GetLastCommand=ccUser2) THEN
  832.       IF SelectFile(Cfg.BiMail.BiModemPath) THEN ConfigChanged:=True;
  833.     IF ESR^.CurrentFieldModified THEN ConfigChanged:=True;
  834.   END;
  835.  
  836.   PROCEDURE ConnectionSetup;
  837.   VAR
  838.     Win : WindowPtr;
  839.   BEGIN
  840.     GetEsrAndWin(EsrConnectionSetup,2,Esr,Win);
  841.     WITH Esr DO
  842.     BEGIN
  843.       EntryCommands.AddCommand(ccUser2, 1, F2, 0);
  844.       SetPostEditProc(ConnectionPostEdit);
  845.       REPEAT
  846.         Process;
  847.       UNTIL GetLastCommand IN [ccDone,ccQuit];
  848.     END;
  849.     Esr.Done;
  850.     KillWindow(Win);
  851.   END;
  852.  
  853.   PROCEDURE AreaManagerConfiguration;
  854.   VAR
  855.     Win : WindowPtr;
  856.   BEGIN
  857.     GetEsrAndWin(EsrAreaManSetup,2,esr,Win);
  858.     DoEsr(Esr,Win);
  859.   END;
  860.  
  861.   PROCEDURE ListSetup;
  862.   VAR
  863.     FuncKeyWin : windowptr;
  864.   BEGIN
  865.     MyWin(FuncKeyWin, 1,ScreenHeight-1,80,ScreenHeight,2,'',False);
  866.     WITH FuncKeyWin^, cfg.color[2] DO
  867.     BEGIN
  868.       wFastText('F1=Help        F2=Select',1,2);
  869.     END;
  870.     GetEsr(EsrListFiles,2,esr);
  871.     WITH Esr DO
  872.     BEGIN
  873.       SetPostEditProc(ConfigPostEdit);
  874.       EntryCommands.AddCommand(ccUser2, 1, F2, 0);
  875.     END;
  876.     REPEAT
  877.       ESR.PROCESS;
  878.       CASE Esr.GetLastCommand OF
  879.         ccUser2 : CASE Esr.GetCurrentId OF
  880.                     0 : IF SelectFile(Cfg.ListFiles.FileList) THEN ConfigChanged:=True;
  881.                     1 : IF SelectFile(Cfg.ListFiles.NewsList) THEN ConfigChanged:=True;
  882.                     2 : IF SelectFile(Cfg.ListFiles.Header) THEN ConfigChanged:=True;
  883.                     3 : IF SelectFile(Cfg.ListFiles.Footer) THEN ConfigChanged:=True;
  884.                     4 : IF SelectFile(Cfg.ListFiles.StatFile) THEN ConfigChanged:=True;
  885.                     5 : IF SelectFile(Cfg.ListFiles.TopFile) THEN ConfigChanged:=True;
  886.                     6 : IF SelectFile(Cfg.ListFiles.DoBefore) THEN ConfigChanged:=True;
  887.                     7 : IF SelectFile(Cfg.ListFiles.DoPack) THEN ConfigChanged:=True;
  888.                     8 : IF SelectFile(Cfg.ListFiles.DoAfter) THEN ConfigChanged:=True;
  889.                   END;
  890.       END;
  891.     UNTIL (esr.getlastcommand=ccquit) OR (esr.getlastcommand=ccDone);
  892.     Esr.Done;
  893.     KillWindow(FuncKeyWin);
  894.   END;
  895.  
  896.   PROCEDURE ListSetup2;
  897.   VAR
  898.     Win : WindowPtr;
  899.   BEGIN
  900.     GetEsrAndWin(EsrListFiles2,2,esr,Win);
  901.     DoEsr(Esr,Win);
  902.   END;
  903. FUNCTION _GetMFSStr(VAR Buffer; VAR f: TNetFile): String; far;
  904. VAR
  905.   s   : STRING;
  906. BEGIN
  907.   WITH TFileListSegment(Buffer) DO
  908.   BEGIN
  909.     s:=Pad(Name,22)+FileName;
  910.   END;
  911.   _GetMFSStr:=s;
  912. END;
  913.  
  914. PROCEDURE _EditMFS(VAR Buffer; VAR Changed: Boolean; RecNum, MaxRec: LongInt); far;
  915. VAR
  916.   ExitCode:WORD;
  917. BEGIN
  918.   Esr.Select;
  919.   Esr.SetNextField(0);
  920.   Esr.Draw;
  921.   Save:=False;
  922.   REPEAT
  923.     Esr.Process;
  924.     CASE Esr.GetLastCommand OF
  925.       ccUser2 : CASE Esr.GetCurrentId OF
  926.                   1 : IF SelectFile(TFileListSegment(Buffer).FileName) THEN ConfigChanged:=True;
  927.                   2 : IF SelectFile(TFileListSegment(Buffer).HeaderFile) THEN ConfigChanged:=True;
  928.                 END;
  929.     END;
  930.   UNTIL (esr.getlastcommand=ccquit) OR (esr.getlastcommand=ccDone);
  931.   Changed:=Save or configChanged;
  932. END;
  933.  
  934. PROCEDURE _InitMFS(VAR Buffer); far;
  935. BEGIN
  936.   FillChar(Buffer,SizeOf(TFileListSegment),0);
  937. END;
  938.  
  939. FUNCTION _IsGreaterMFS(VAR B1,B2): Boolean; far;
  940. BEGIN
  941.   _IsGreaterMFS:=TFileListSegment(B1).Name>TFileListSegment(B2).Name;
  942. END;
  943.  
  944. PROCEDURE MFSPostEdit(Esr: EntryScreenPtr); far;
  945. BEGIN
  946.   IF (ESR^.CurrentFieldModified) THEN Save:=True;
  947. END;
  948.  
  949.   PROCEDURE MultiFilelistSetup;
  950.   VAR
  951.     ExitCode:WORD;
  952.     p:POINTER;
  953.     f : TNetFile;
  954.  
  955.     PROCEDURE MakeMFSScreen;
  956.     BEGIN
  957.       GetEsr(EsrMFSSetup,2,Esr);
  958.       Esr.SetPostEditProc(MFSPostEdit);
  959.       EntryCommands.AddCommand(ccUser2, 1, F2, 0);
  960.       p:=Esr.GetUserRecord;
  961.     END;
  962.  
  963.   BEGIN
  964.     f.Open(StartPath+PoPListSegmentsName,SizeOf(TFileListSegment),True);
  965.     MakeMFSScreen;
  966.     BrowseRecords(f,p^,ExitCode,'Multiple Filelist Segments',
  967.                   Pad('Name',22)+'FileName',_GetMFSStr,_EditMFS,_InitMFS,_IsGreaterMFS);
  968.     Esr.Done;
  969.     f.Close;
  970.   END;
  971.  
  972.   PROCEDURE MultiBBSSetUp;
  973.   VAR
  974.     Win : WindowPtr;
  975.   BEGIN
  976.     GetEsrAndWin(EsrMultiBBSSetup,2,esr,Win);
  977.     DoEsr(Esr,Win);
  978.   END;
  979.  
  980.   PROCEDURE ArchiverSetUp;
  981.   VAR
  982.     Win : WindowPtr;
  983.   BEGIN
  984.     GetEsrAndWin(EsrArcSetup,2,Esr,Win);
  985.     DoEsr(Esr,Win);
  986.   END;
  987.  
  988.   FUNCTION ReqOnUsStr(CONST ReqOnUs: TReqOnUs): S10;
  989.   BEGIN
  990.     CASE ReqOnUs OF
  991.       ru_NoWay   : ReqOnUsStr:='No way!   ';
  992.       ru_Always  : ReqOnUsStr:='Always    ';
  993.       ru_Cost    : ReqOnUsStr:='Check cost';
  994.       ELSE         ReqOnUsStr:='??????????';
  995.     END;
  996.   END;
  997.  
  998.   PROCEDURE IncReqOnUs(VAR Value; ID: Word; Factor: Integer; VAR s:String);
  999.   BEGIN
  1000.     CASE Factor OF
  1001.       +1: IF Byte(Value)<2 THEN Inc(Byte(Value)) ELSE Byte(Value):=0;
  1002.       -1: IF Byte(Value)>0 THEN Dec(Byte(Value)) ELSE Byte(Value):=2;
  1003.     END;
  1004.     s:=ReqOnUsStr(TReqOnUs(Value));
  1005.   END;
  1006.  
  1007.   PROCEDURE RequestLimits;
  1008.   VAR
  1009.     Win : WindowPtr;
  1010.   BEGIN
  1011.     GetEsrAndWin(EsrReqLimits,2,Esr,Win);
  1012.     DoEsr(Esr,Win);
  1013.   END;
  1014.  
  1015.   PROCEDURE DisableItems;
  1016.   VAR
  1017.     i : LongInt;
  1018.   BEGIN
  1019.     FOR i:=100 TO 108 DO
  1020.       IF (i<>106) AND (i<>104) THEN MainMenu^.ProtectItem(i);
  1021.     MainMenu^.ProtectItem(ALTB);
  1022.     MainMenu^.ProtectItem(ALTL);
  1023.     MainMenu^.ProtectItem(ALTF);
  1024.     MainMenu^.Draw;
  1025.   END;
  1026.  
  1027.   PROCEDURE Configuration(Forced: Boolean; VAR Key: LongInt);
  1028.   VAR
  1029.     MustExit,
  1030.     SaveIt : Boolean;
  1031.     EventFile : TNetFile;
  1032.   BEGIN
  1033.     ConfigChanged:=False;
  1034.     MustExit:=False;
  1035.     IF NOT Forced THEN
  1036.     BEGIN
  1037.       LoadMainMenu;
  1038.       IF Key<=0 THEN
  1039.       BEGIN
  1040.         IF Key=-1 THEN DisableItems ELSE MainMenu^.Draw;
  1041.         MainMenu^.SelectSubMenu(1);
  1042.         Key:=0;
  1043.       END;
  1044.     END ELSE
  1045.     BEGIN
  1046.       IF NOT Confirm('Configure Portal from scratch','Y',11) THEN
  1047.       BEGIN
  1048.         FinishPortal;
  1049.         Halt;
  1050.       END;
  1051.       LoadColorScheme(StartPath);
  1052.       Key:=0;
  1053.       data.event:=1;
  1054.       FILLCHAR(CurrentEvent,SizeOf(CurrentEvent),0);
  1055.       WITH CurrentEvent DO
  1056.         active:=255;
  1057.       EventFile.Open(StartPath+PoPEventFileName,SizeOf(TEvent),True);
  1058.       EventFile.PutRec(CurrentEvent,0);
  1059.       EventFile.Close;
  1060.     END;
  1061.     REPEAT
  1062.       IF Forced THEN
  1063.       BEGIN
  1064.         CASE key OF
  1065.           0..2 : Inc(key);
  1066.           3    : Key:=34;
  1067.           34   : Key:=13;
  1068.           13   : Key:=14;
  1069.           14   : Key:=6;
  1070.           6    : Key:=0;
  1071.         END;
  1072.       END ELSE
  1073.         IF Key=0 THEN
  1074.         BEGIN
  1075.           MainMenuToggle;
  1076.           InMainMenu:=True;
  1077.           MainMenu^.Process;
  1078.           InMainMenu:=False;
  1079.           Key:=MainMenu^.MenuChoice;
  1080.           IF Key>100 THEN MainMenu^.EraseAllSubMenus(True, True);
  1081.           IF (Key<90) OR (Key>97) THEN MainMenu^.Erase;
  1082.         END;
  1083.       IF (Forced) OR (MainMenu^.GetLastCommand<>ccQuit) THEN
  1084.       BEGIN
  1085.         CASE key OF
  1086.           1 : matrix_info;
  1087.           2 : ModemOptions;
  1088.           3 : directories;
  1089.           4 : Nodes;
  1090.           5 : AdvModemOptions;
  1091.           6 : EventEdit;
  1092.           7 : ConnectStatistics;
  1093.           8 : LoadColorScheme(StartPath);
  1094.           9 : SaveColorScheme;
  1095.          10 : NodeListCompilerSetup;
  1096.          11 : Function_Key_Options;
  1097.          12 : GlobalValues;
  1098.          13 : ColorConfiguration;
  1099.          14 : MiscScreen;
  1100.          15 : NetMail;
  1101.          16 : EchoMail;
  1102.          17 : InboundControl;
  1103.          18 : SchedulerSetup;
  1104.          19 : BrowseAreas;
  1105.          20 : MiscOptions;
  1106.          21 : FilesToForward;
  1107.          22 : FwdMiscOptions;
  1108.          23 : DumbTerminalSetup;
  1109.          24 : DumbTerminalExternalProtocols;
  1110.          25 : ConnectionSetup;
  1111.          26 : AreaManagerConfiguration;
  1112.          27 : MultiBBSSetup;
  1113.          28 : ArchiverSetup;
  1114.          29 : NodeListCompilerTranslationTable;
  1115.          30 : EditOkFile;
  1116.          31 : RequestLimits;
  1117.          32 : TickAreas;
  1118.          33 : TickMisc;
  1119.          34 : NodeListSegSetup;
  1120.          35 : ListSetup;
  1121.          36 : ListSetup2;
  1122.          37 : IF Cfg.NlCompiler.CostFileName<>'' THEN
  1123.                 RunTextEditor(Cfg.NlCompiler.CostFileName);
  1124.          38 : RunTextEditor(StartPath+PoPTemplateFIleName);
  1125.          39 : MultiFileListSetup;
  1126.         214 : ExportConfig;
  1127.         215 : ImportConfig;
  1128.          ELSE MustExit:=NOT Forced;
  1129.         END;
  1130.       END;
  1131.       IF NOT Forced AND NOT MustExit THEN Key:=0;
  1132.     UNTIL ((MainMenu<>NIL) AND (MainMenu^.GetLastCommand=ccQuit)) OR MustExit OR (Forced AND (key=0));
  1133.     IF Forced THEN
  1134.       Saveit:=True
  1135.     ELSE
  1136.       IF ConfigChanged THEN
  1137.         SaveIt:=Confirm('Save new configuration','Y',11)
  1138.       ELSE
  1139.         SaveIt:=False;
  1140.     IF SaveIt THEN SaveConfiguration ELSE LoadConfiguration;
  1141.     IF NOT MustExit THEN Key:=0;
  1142.   END;
  1143.  
  1144. END.
  1145.